home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ForCLI / MCommands_1_0.lha / Src / clickstart.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-19  |  5.1 KB  |  193 lines

  1. #define __USE_SYSBASE
  2.  
  3. #include <exec/types.h>
  4. #include <exec/execbase.h>
  5. #include <dos/rdargs.h>
  6. #include <dos/dosextens.h>
  7. #include <dos/var.h>
  8. #include <devices/trackdisk.h>
  9. #include <support/types.h>
  10. #include <support/exec.h>
  11.  
  12. #include <string.h>
  13.  
  14. #include <proto/exec.h>
  15. #include <proto/dos.h>
  16.  
  17. #include "clickstart.rev.h"
  18.  
  19. #define DOS_NAME        "dos.library"
  20. #define DOS_VERN        37L
  21. #define TRACK_NAME    "trackdisk.device"
  22.  
  23. #define TEMPLATE        "CLICK/S,NOCLICK/S,STAR/S,NOSTAR/S,PIPE/K,NOPIPE/S,"\
  24.                                         "MULTI/K,NOMULTI/S,ALERT/K/N,QUIET/S"
  25.  
  26. #define OPT_CLICK        0
  27. #define OPT_NOCLICK    1
  28. #define OPT_STAR        2
  29. #define OPT_NOSTAR    3
  30. #define OPT_PIPE        4
  31. #define OPT_NOPIPE    5
  32. #define OPT_MULTI        6
  33. #define OPT_NOMULTI    7
  34. #define OPT_ALERT        8
  35. #define OPT_QUIET        9
  36. #define OPT_COUNT        10
  37.  
  38. #define STATE_CLICK    0
  39. #define STATE_STAR    1
  40. #define STATE_PIPE    2
  41. #define STATE_MULTI    3
  42. #define STATE_ALERT    4
  43. #define STATE_COUNT    5
  44.  
  45. /* Pipe enable/disable */
  46. #define PIPE_VAR_NAME        "_pchar"
  47. #define PIPE_VAR_LEN        1
  48. #define PIPE_VAR_FLAGS    (LV_VAR | GVF_LOCAL_ONLY)
  49.  
  50. /* Multi command enable/disable */
  51. #define MULT_VAR_NAME        "_mchar"
  52. #define MULT_VAR_LEN        1
  53. #define MULT_VAR_FLAGS    (LV_VAR | GVF_LOCAL_ONLY)
  54.  
  55. #define VAR_PIPE                0
  56. #define VAR_MULTI                1
  57. #define VAR_COUNT                2
  58. #define VAR_SIZE                max(PIPE_VAR_LEN,MULT_VAR_LEN)+3
  59.  
  60. /* Default pipe and multi characters */
  61. #define DEF_PIPE                "|"
  62. #define DEF_MULTI                "\\"
  63.  
  64. #define ONOFF(flag)         ((flag) ? "ON" : "OFF")
  65. #define PStr(arg,def)        (*((STRPTR)(arg))=='\0' ? (STRPTR)(def) : (STRPTR)(arg))
  66. #define AlTime(time)        ((time)>0 ? (time) : 0)
  67.  
  68. STATIC CONST TEXT VersionString[]=
  69.     VERSION(PROG_NAME,PROG_VERSION,PROG_REVISION,PROG_DATE);
  70.  
  71. ULONG ClickStart(VOID)
  72. {
  73.     struct ExecBase *SysBase=*((struct ExecBase **)4);
  74.     struct DosLibrary *DOSBase;
  75.  
  76.     struct RDArgs *Args;
  77.     struct MsgPort *Port;
  78.     struct IOExtTD *IO;
  79.     struct LocalVar *Var;
  80.     LONG Options[OPT_COUNT];
  81.     ULONG Unit,RC=RETURN_FAIL;
  82.     STRPTR States[STATE_COUNT];
  83.     CHAR VarValues[VAR_COUNT][VAR_SIZE];
  84.     BOOL ErrOccured=FALSE;
  85.  
  86.     if(!(DOSBase=(struct DosLibrary *)OpenLibrary(DOS_NAME,DOS_VERN)))
  87.     {
  88.         SetResult2(ERROR_INVALID_RESIDENT_LIBRARY);
  89.         goto InvalidDOS;
  90.     }
  91.  
  92.     clear(&Options);                                        /* Clear out buffer */
  93.     if(!(Args=ReadArgs(TEMPLATE,Options,NULL)))
  94.     {
  95.         PrintFault(IoErr(),NULL);                    /* Inform user */
  96.         goto NoArgs;
  97.     }
  98.  
  99.     States[STATE_CLICK]="?";        /* In case it is not possible to open device */
  100.  
  101.     if(Port=CreateMsgPort())
  102.     {
  103.         if(IO=CreateIORequest(Port,sizeof(struct IOExtTD)))
  104.         {
  105.             for(Unit=0; Unit<4; Unit++)
  106.             {
  107.                 if(OpenDevice(TRACK_NAME,Unit,(struct IORequest *)IO,0)==0)
  108.                 {
  109.                     if(Options[OPT_CLICK])
  110.                         fclr(((struct TDU_PublicUnit*)(IO->iotd_Req.io_Unit))->
  111.                                     tdu_PubFlags,TDPF_NOCLICK);
  112.                     if(Options[OPT_NOCLICK])
  113.                         fset(((struct TDU_PublicUnit*)(IO->iotd_Req.io_Unit))->
  114.                                     tdu_PubFlags,TDPF_NOCLICK);
  115.                     States[STATE_CLICK]=
  116.                         ONOFF(!ftst(((struct TDU_PublicUnit*)(IO->iotd_Req.io_Unit))->
  117.                                                 tdu_PubFlags,TDPF_NOCLICK));
  118.                     CloseDevice((struct IORequest *)IO);
  119.                 }
  120.             }
  121.             DeleteIORequest(IO);
  122.         }
  123.         else
  124.             ErrOccured=TRUE;
  125.         DeleteMsgPort(Port);
  126.     }
  127.     else
  128.         ErrOccured=TRUE;
  129.  
  130.     /* Wildstar */
  131.     if(Options[OPT_STAR])                                                        /* Enable */
  132.         fset(DOSBase->dl_Root->rn_Flags,RNF_WILDSTAR);
  133.     if(Options[OPT_NOSTAR])                                                    /* Disable */
  134.         fclr(DOSBase->dl_Root->rn_Flags,RNF_WILDSTAR);
  135.     States[STATE_STAR]=                                                            /* Get current state */
  136.         ONOFF(ftst(DOSBase->dl_Root->rn_Flags,RNF_WILDSTAR));
  137.  
  138.     /* Piping */
  139.     if(Options[OPT_PIPE])                                                        /* Enable pipes */
  140.         ErrOccured=SetVar(PIPE_VAR_NAME,PStr(Options[OPT_PIPE],DEF_PIPE),
  141.                                             PIPE_VAR_LEN,PIPE_VAR_FLAGS);
  142.     if(Options[OPT_NOPIPE])                                                    /* Disable pipes */
  143.         ErrOccured=DeleteVar(PIPE_VAR_NAME,PIPE_VAR_FLAGS);
  144.     if(Var=FindVar(PIPE_VAR_NAME,PIPE_VAR_FLAGS))        /* Check current state */
  145.     {
  146.         VarValues[VAR_PIPE][0]='\'';
  147.         VarValues[VAR_PIPE][1]=*(Var->lv_Value);
  148.         VarValues[VAR_PIPE][2]='\'';
  149.         VarValues[VAR_PIPE][3]='\0';
  150.         States[STATE_PIPE]=&VarValues[VAR_PIPE][0];
  151.     }
  152.     else
  153.         States[STATE_PIPE]="OFF";
  154.  
  155.     /* Multi command execution */
  156.     if(Options[OPT_MULTI])                                                    /* Enable */
  157.         ErrOccured=SetVar(MULT_VAR_NAME,PStr(Options[OPT_MULTI],DEF_MULTI),
  158.                                             MULT_VAR_LEN,MULT_VAR_FLAGS);
  159.     if(Options[OPT_NOMULTI])                                                /* Disable */
  160.         ErrOccured=DeleteVar(MULT_VAR_NAME,MULT_VAR_FLAGS);
  161.     if(Var=FindVar(MULT_VAR_NAME,MULT_VAR_FLAGS))        /* Check current state */
  162.     {
  163.         VarValues[VAR_MULTI][0]='\'';
  164.         VarValues[VAR_MULTI][1]=*(Var->lv_Value);
  165.         VarValues[VAR_MULTI][2]='\'';
  166.         VarValues[VAR_MULTI][3]='\0';
  167.         States[STATE_MULTI]=&VarValues[VAR_MULTI][0];
  168.     }
  169.     else
  170.         States[STATE_MULTI]="OFF";
  171.  
  172.     /* Alerts timing */
  173.     if(Options[OPT_ALERT])
  174.         SysBase->LastAlert[3]=AlTime(*((LONG *)Options[OPT_ALERT]));
  175.     States[STATE_ALERT]=(STRPTR)SysBase->LastAlert[3];
  176.  
  177.     RC=(ErrOccured ? RETURN_ERROR : RETURN_OK);
  178.  
  179.     unless(Options[OPT_QUIET])
  180.         VPrintf("System state:\n"
  181.                         "\tDrive click is %s\n"
  182.                         "\tStar is %s\n"
  183.                         "\tPipe char is %s\n"
  184.                         "\tMulti command char is %s\n"
  185.                         "\tAlert lasts %ld frames\n",(LONG *)States);
  186.  
  187.     FreeArgs(Args);
  188. NoArgs:
  189.     CloseLibrary((struct Library *)DOSBase);
  190. InvalidDOS:
  191.     return(RC);
  192. }
  193.